from app.models import TravelInfo,User
import json
# monthList：
# 这是一个包含了英文月份名称的列表，从January到December，用于在涉及时间展示（比如按月份统计数据时将数字月份转换为英文展示等场景）
# 相关功能中作为参考数据，方便获取对应英文月份字符串。
monthList = ['January','February','March','April','May','June','July','August','Suptember','October','November','December']
# cityList：
# 它是一个字典列表，每个字典包含了省份（province键）以及对应省份下的城市列表（city键）信息。这个数据结构可以用于查询特定省份包含哪些城市，
# 或者在涉及地理区域相关的数据处理、筛选、展示等功能中发挥作用，比如统计不同省份旅游资源与城市的关联情况等。
cityList = [
                {'province': '北京', 'city': ['北京市']},
                {'province': '天津', 'city': ['天津市']},
                {'province': '河北', 'city': ['石家庄市', '唐山市', '秦皇岛市', '邯郸市', '邢台市', '保定市', '张家口市', '承德市', '沧州市', '廊坊市', '衡水市']},
                {'province': '山西', 'city': ['太原市', '大同市', '阳泉市', '长治市', '晋城市', '朔州市', '晋中市', '运城市', '忻州市', '临汾市', '吕梁市']},
                {'province': '内蒙古自治区',
                 'city': ['呼和浩特市', '包头市', '乌海市', '赤峰市', '通辽市', '鄂尔多斯市', '呼伦贝尔市', '巴彦淖尔市', '乌兰察布市', '兴安盟', '锡林郭勒盟', '阿拉善盟']},
                {'province': '辽宁',
                 'city': ['沈阳市', '大连市', '鞍山市', '抚顺市', '本溪市', '丹东市', '锦州市', '营口市', '阜新市', '辽阳市', '盘锦市', '盘锦市', '朝阳市', '葫芦岛市']},
                {'province': '吉林', 'city': ['长春市', '吉林市', '四平市', '辽源市', '通化市', '白山市', '松原市', '白城市', '延边']},
                {'province': '黑龙江',
                 'city': ['哈尔滨市', '齐齐哈尔市', '鸡西市', '鹤岗市', '双鸭山市', '大庆市', '伊春市', '佳木斯市', '七台河市', '牡丹江市', '黑河市', '绥化市',
                          '大兴安岭地区', ]},
                {'province': '上海市', 'city': ['上海市']},
                {'province': '江苏',
                 'city': ['南京市', '无锡市', '徐州市', '常州市', '苏州市', '南通市', '连云港市', '淮安市', '盐城市', '扬州市', '镇江市', '泰州市', '宿迁市']},
                {'province': '浙江', 'city': ['杭州市', '宁波市', '温州市', '嘉兴市', '湖州市', '绍兴市', '金华市', '衢州市', '舟山市', '台州市', '丽水市']},
                {'province': '安徽',
                 'city': ['合肥市', '芜湖市', '蚌埠市', '淮南市', '马鞍山市', '淮北市', '铜陵市', '安庆市', '黄山市', '滁州市', '阜阳市', '宿州市', '六安市', '亳州市',
                          '池州市', '宣城市']},
                {'province': '福建', 'city': ['福州市', '厦门市', '莆田市', '三明市', '泉州市', '漳州市', '南平市', '龙岩市', '宁德市']},
                {'province': '江西', 'city': ['南昌市', '景德镇市', '萍乡市', '九江市', '新余市', '鹰潭市', '赣州市', '吉安市', '宜春市', '抚州市', '上饶市']},
                {'province': '山东',
                 'city': ['济南市', '青岛市', '淄博市', '枣庄市', '东营市', '烟台市', '潍坊市', '济宁市', '泰安市', '威海市', '日照市', '莱芜市', '临沂市', '德州市',
                          '聊城市', '滨州市', '菏泽市']},
                {'province': '河南',
                 'city': ['郑州市', '开封市', '洛阳市', '平顶山市', '安阳市', '鹤壁市', '新乡市', '焦作市', '济源市', '濮阳市', '许昌市', '漯河市', '三门峡市', '南阳市',
                          '商丘市', '信阳市', '周口市', '驻马店市']},
                {'province': '湖北',
                 'city': ['武汉市', '黄石市', '十堰市', '宜昌市', '襄阳市', '鄂州市', '荆门市', '孝感市', '荆州市', '黄冈市', '咸宁市', '随州市', '恩施', '仙桃市',
                          '潜江市', '天门市', '神农架林区']},
                {'province': '湖南',
                 'city': ['长沙市', '株洲市', '湘潭市', '衡阳市', '邵阳市', '岳阳市', '常德市', '张家界市', '益阳市', '郴州市', '永州市', '怀化市', '娄底市', '湘西']},
                {'province': '广东',
                 'city': ['广州市', '韶关市', '深圳市', '珠海市', '汕头市', '佛山市', '江门市', '湛江市', '茂名市', '肇庆市', '惠州市', '梅州市', '汕尾市', '河源市',
                          '阳江市', '清远市', '东莞市', '中山市', '东沙群岛', '潮州市', '揭阳市', '云浮市']},
                {'province': '广西',
                 'city': ['南宁市', '柳州市', '桂林市', '梧州市', '北海市', '防城港市', '钦州市', '贵港市', '玉林市', '百色市', '贺州市', '河池市', '来宾市', '崇左市']},
                {'province': '海南',
                 'city': ['海口市', '三亚市', '三沙市', '五指山市', '琼海市', '儋州市', '文昌市', '万宁市', '东方市', '定安县', '屯昌县', '澄迈县', '临高县', '白沙',
                          '昌江', '乐东', '陵水', '保亭', '琼中']},
                {'province': '重庆', 'city': ['重庆市']},
                {'province': '四川',
                 'city': ['成都市', '自贡市', '攀枝花市', '泸州市', '德阳市', '绵阳市', '广元市', '遂宁市', '内江市', '乐山市', '南充市', '眉山市', '宜宾市', '广安市',
                          '达州市', '雅安市', '巴中市', '资阳市', '阿坝', '甘孜', '凉山']},
                {'province': '贵州', 'city': ['贵阳市', '六盘水市', '遵义市', '安顺市', '铜仁市', '黔西南', '毕节市', '黔东南', '黔南']},
                {'province': '云南',
                 'city': ['昆明市', '曲靖市', '玉溪市', '保山市', '昭通市', '丽江市', '普洱市', '临沧市', '楚雄', '红河', '文山', '西双版纳', '大理', '德宏', '怒江',
                          '迪庆']},
                {'province': '西藏', 'city': ['拉萨市', '昌都地区', '山南地区', '日喀则地区', '那曲地区', '阿里地区', '林芝地区']},
                {'province': '陕西', 'city': ['西安市', '铜川市', '宝鸡市', '咸阳市', '渭南市', '延安市', '汉中市', '榆林市', '安康市', '商洛市']},
                {'province': '甘肃',
                 'city': ['兰州市', '嘉峪关市', '金昌市', '白银市', '天水市', '武威市', '张掖市', '平凉市', '酒泉市', '庆阳市', '定西市', '陇南市', '临夏', '甘南']},
                {'province': '青海', 'city': ['西宁市', '海东市', '海北', '黄南', '海南', '果洛', '玉树', '海西']},
                {'province': '宁夏', 'city': ['银川市', '石嘴山市', '吴忠市', '固原市', '中卫市']},
                {'province': '新疆',
                 'city': ['乌鲁木齐市', '克拉玛依市', '吐鲁番地区', '哈密地区', '昌吉', '博尔塔拉', '巴音郭楞', '阿克苏地区', '克孜勒苏柯尔克孜自治州', '喀什地区', '和田地区', '伊犁',
                          '塔城地区', '阿勒泰地区', '石河子市', '阿拉尔市', '图木舒克市', '五家渠市']},
                {'province': '台湾',
                 'city': ['台北市', '高雄市', '台南市', '台中市', '金门县', '南投县', '基隆市', '新竹市', '嘉义市', '新北市', '宜兰县', '新竹县', '桃园县', '苗栗县',
                          '彰化县', '嘉义县', '云林县', '屏东县', '台东县', '花莲县', '澎湖县', '连江县']},
                {'province': '香港', 'city': ['香港岛', '香港岛', '新界']},
                {'province': '澳门', 'city': ['澳门', '离岛']}
            ]
# 函数目的：该函数旨在获取所有旅游信息中涉及的不同省份列表，去除重复的省份名称，以提供一个唯一的省份集合。
def getCityList():
    # 实现逻辑：
    # 首先调用getAllTravelInfoMapData函数（无参数调用，会获取所有的旅游信息数据）来获取旅游信息列表，
    # 这里返回的列表中每个元素（代表旅游项目的对象）都有一个province属性用于表示所属省份。
    travelList = getAllTravelInfoMapData()
    # 然后通过列表推导式[x.province for x in travelList]提取出每个旅游项目的省份名称，构建成一个新的列表，
    # 再使用set函数将这个列表转换为集合以去除重复元素（集合中的元素具有唯一性），最后再将集合转换回列表并返回，这样得到的就是不重复的省份名称列表。
    return list(set([x.province for x in travelList]))
# 函数目的：根据传入的省份参数情况，获取相应的旅游信息数据列表，并对获取到的数据中的特定字段（img_list和comments）
# 进行 JSON 格式的解析转换，返回处理后的旅游信息列表。
def getAllTravelInfoMapData(province=None):
    # 实现逻辑：
    # 首先定义了一个内部函数map_fn，它的作用是对传入的单个旅游信息对象（item）进行数据处理。具体来说，将对象中的img_list和comments属性
    # （原始存储为 JSON 字符串形式）
    # 通过json.loads函数进行解析，转换为 Python 对象（比如列表、字典等相应的 JSON 解析后的结构），然后返回处理后的对象。
    def map_fn(item):
        item.img_list = json.loads(item.img_list)
        item.comments = json.loads(item.comments)
        return item
    # 接着根据传入的province参数进行不同的数据库查询操作：
    # 如果province参数有值（不为None），则通过TravelInfo.objects.filter(province=province)从数据库中筛选出对应省份的旅游信息，
    # 这里TravelInfo是继承自 Django 的models.Model类的模型，filter方法用于按照指定条件（此处是省份匹配）进行筛选查询，
    # 返回符合条件的旅游信息对象列表。
    if province:
        travelList = TravelInfo.objects.filter(province=province)
    # 如果province参数为None，则使用TravelInfo.objects.all()获取数据库中所有的旅游信息对象列表。
    else:
        travelList = TravelInfo.objects.all()
    travelListMap = list(map(map_fn,travelList))
    # 最后使用map函数结合map_fn函数对获取到的旅游信息列表（travelList）中的每个元素进行处理，将处理后的结果转换为列表
    # （通过list函数包裹map的结果），并返回这个处理后的旅游信息列表travelListMap。
    return travelListMap
#函数目的：获取所有用户的信息数据，这里返回的应该是一个包含所有用户信息对象的查询集（假设基于 Django 框架下，User是用户模型类），
# 可用于后续进一步的数据处理、分析或者展示等操作。
def getAllUsersInfoData():
    # 实现逻辑：直接调用User.objects.all()方法，该方法（在 Django 的模型操作中）用于从数据库中获取对应模型（此处是User模型）的所有记录对象，
    # 形成一个查询集并返回，这个查询集可以像列表一样进行遍历等操作来访问具体的用户信息对象。
    return User.objects.all()
# 函数目的：该函数的目的是汇总获取所有旅游项目的评论信息，将各个旅游项目下的评论收集到一个统一的列表中返回，
# 以便进行整体的评论相关的数据统计、分析或者展示等操作。
def getAllCommentsData():
    # 实现逻辑：
    # 首先调用getAllTravelInfoMapData函数获取所有的旅游信息列表（每个元素包含旅游项目相关信息，其中有comments属性，
    # 存储该旅游项目的评论信息，列表形式）。
    travelList = getAllTravelInfoMapData()
    commentsList = []
    # 然后通过两层嵌套循环，外层循环遍历每个旅游项目，
    for travel in travelList:
        # 内层循环遍历每个旅游项目的评论列表，将每个评论对象添加到commentsList列表中，这样最终commentsList就包含了所有旅游项目的所有评论信息，
        # 最后返回这个列表。
        for comment in travel.comments:
            commentsList.append(comment)
    return commentsList
